热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

字形|都会_CSS字体加密反反爬通用方法

篇首语:本文由编程笔记#小编为大家整理,主要介绍了CSS字体加密反反爬通用方法相关的知识,希望对你有一定的参考价值。文章目录

篇首语:本文由编程笔记#小编为大家整理,主要介绍了CSS字体加密反反爬通用方法相关的知识,希望对你有一定的参考价值。



文章目录


    • 前言
    • 环境配置
      • 下载tesseract
      • 下载训练集

    • 识别代码
    • 效果演示
    • 58同城招聘



前言

对于CSS字体加密,我目前遇到了这几种情况:


  1. 字体字形坐标点与编码之间的对应关系不会随着多次请求而变化,例如:58同城房子出租
  2. 字体字形坐标点每次请求时,位置不固定,但是每个文字的打点数量一致,例如:猿人学第7题
  3. 字体的打点坐标点与打点数量随着每次请求都会发生变换,例如:58同城招聘

我们之所以认为1这个形状是数字一。是因为我们通过学习后才懂得,“哦!这个是 ‘1‘ 。”

所以,为了让电脑识别出文字,就可以依靠机器学习,啊,但是我不会。直接上手机器学习针对的是比较难识别的图像,例如:复杂的验证码。

对于有规则的字体,我们就可以借助OCR(光学字符识别)识别文字。

本文使用到就是**tesseract-ocr+简体中文训练集**

大致流程:

根据已有的字体文件,将这些字体绘制到图片上,再通过OCR识别这些字符。

注意:


  1. 字体越多,识别花费的时间就越长;
  2. 能通过字体文件规律解密的,则不建议使用这种方法;

环境配置

环境配置参考文章:
https://blog.csdn.net/u010454030/article/details/80515501


下载tesseract

tesseract-ocr-setup-3.05.02下载


下载训练集

中文训练集下载


识别代码

# -*- coding: utf-8 -*-
"""
Created on 2021/4/27 16:34
---------
@summary:
---------
@author: mkdir700
@email: mkdir700@gmail.com
"""

import base64
import numpy
import pytesseract
from fontTools.ttLib import TTFont
from PIL import Image, ImageDraw, ImageFont
def fontConvert(fontPath):
"""
解析字体文件
:param fontPath: 字体文件路径
:return: 编码和汉字的对应关系
"""

font = TTFont(fontPath)
codeList = font.getGlyphOrder()[1:]
# print(codeList)

# 创建画布
im = Image.new("RGB", (1800, 1000), (255, 255, 255))
dr = ImageDraw.Draw(im)

# 加载字体文件对象
font = ImageFont.truetype(fontPath, 40)

word_count = len(codeList)
if word_count >= 40:
lines = word_count // 40 # 文字排列的行数,在图片上分行展示
else:
lines = word_count
arrayList = numpy.array_split(codeList, lines)
# print(arrayList)

# 将字体文件中的文字绘制成图片
for t in range(lines):
newList = [i.replace("uni", "\\\\u") for i in arrayList[t]]
text = "".join(newList)
text = text.encode('utf-8').decode('unicode_escape')
dr.text((0, 50 * t), text, font=font, fill="#000000")

im.save("temp.jpg")
# im = Image.open("temp.jpg") #可以将图片保存到本地,以便于手动打开图片查看
result = pytesseract.image_to_string(im, lang="chi_sim")
result = result.replace(" ", "").replace("\\n", "")
codeList = [i.replace("uni", "&#x") for i in codeList]
return dict(zip(codeList, list(result)))
if __name__ == '__main__':
b = "xxxx="
content: bytes = base64.b64decode(b.encode())
with open('./1.ttf', 'wb') as f:
f.write(content)
print(fontConvert('./1.ttf'))


效果演示

站点:58同城

地址:https://bj.58.com/searchjob/

右键查看源代码可查看字体文件的base64编码


站点:大众点评

地址:http://www.dianping.com/shop/H7CLU1zL7C5X891z


推荐阅读
  • javascript分页类支持页码格式
    前端时间因为项目需要,要对一个产品下所有的附属图片进行分页显示,没考虑ajax一张张请求,所以干脆一次性全部把图片out,然 ... [详细]
  • 网站访问全流程解析
    本文详细介绍了从用户在浏览器中输入一个域名(如www.yy.com)到页面完全展示的整个过程,包括DNS解析、TCP连接、请求响应等多个步骤。 ... [详细]
  • 利用python爬取豆瓣电影Top250的相关信息,包括电影详情链接,图片链接,影片中文名,影片外国名,评分,评价数,概况,导演,主演,年份,地区,类别这12项内容,然后将爬取的信息写入Exce ... [详细]
  • 深入解析HTML5字符集属性:charset与defaultCharset
    本文将详细介绍HTML5中新增的字符集属性charset和defaultCharset,帮助开发者更好地理解和应用这些属性,以确保网页在不同环境下的正确显示。 ... [详细]
  • 利用REM实现移动端布局的高效适配技巧
    在移动设备上实现高效布局适配时,使用rem单位已成为一种流行且有效的技术。本文将分享过去一年中使用rem进行布局适配的经验和心得。rem作为一种相对单位,能够根据根元素的字体大小动态调整,从而确保不同屏幕尺寸下的布局一致性。通过合理设置根元素的字体大小,开发者可以轻松实现响应式设计,提高用户体验。此外,文章还将探讨一些常见的问题和解决方案,帮助开发者更好地掌握这一技术。 ... [详细]
  • 如何将TS文件转换为M3U8直播流:HLS与M3U8格式详解
    在视频传输领域,MP4虽然常见,但在直播场景中直接使用MP4格式存在诸多问题。例如,MP4文件的头部信息(如ftyp、moov)较大,导致初始加载时间较长,影响用户体验。相比之下,HLS(HTTP Live Streaming)协议及其M3U8格式更具优势。HLS通过将视频切分成多个小片段,并生成一个M3U8播放列表文件,实现低延迟和高稳定性。本文详细介绍了如何将TS文件转换为M3U8直播流,包括技术原理和具体操作步骤,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 解决Only fullscreen opaque activities can request orientation错误的方法
    本文介绍了在使用PictureSelectorLight第三方框架时遇到的Only fullscreen opaque activities can request orientation错误,并提供了一种有效的解决方案。 ... [详细]
  • 本文介绍如何在 Android 中自定义加载对话框 CustomProgressDialog,包括自定义 View 类和 XML 布局文件的详细步骤。 ... [详细]
  • 探索Web 2.0新概念:Widget
    尽管你可能尚未注意到Widget,但正如几年前对RSS的陌生一样,这一概念正逐渐走入大众视野。据美国某权威杂志预测,2007年将是Widget年。本文将详细介绍Widget的定义、功能及其未来发展趋势。 ... [详细]
  • importpymysql#一、直接连接mysql数据库'''coonpymysql.connect(host'192.168.*.*',u ... [详细]
  • 微信公众号推送模板40036问题
    返回码错误码描述说明40001invalidcredential不合法的调用凭证40002invalidgrant_type不合法的grant_type40003invalidop ... [详细]
  • 微软推出Windows Terminal Preview v0.10
    微软近期发布了Windows Terminal Preview v0.10,用户可以在微软商店或GitHub上获取这一更新。该版本在2月份发布的v0.9基础上,新增了鼠标输入和复制Pane等功能。 ... [详细]
  • 我有一个非常有效的多列布局,用于以平铺格式展示图片等元素。然而,我希望这些元素能够按照时间顺序排列。虽然可以通过查询按最后修改时间获取数据,但当前的布局仍然按列进行排序。 ... [详细]
  • 解决Bootstrap DataTable Ajax请求重复问题
    在最近的一个项目中,我们使用了JQuery DataTable进行数据展示,虽然使用起来非常方便,但在测试过程中发现了一个问题:当查询条件改变时,有时查询结果的数据不正确。通过FireBug调试发现,点击搜索按钮时,会发送两次Ajax请求,一次是原条件的请求,一次是新条件的请求。 ... [详细]
  • 本文详细介绍了如何在 Django 项目中使用 Admin 管理后台,包括创建超级用户、启动项目、管理数据模型和修改用户密码等步骤。 ... [详细]
author-avatar
手机用户2502900175
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有